package ar.edu.unrn.lia.dao.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.inject.Named;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import ar.edu.unrn.lia.dao.PropiedadDAO;
import ar.edu.unrn.lia.generic.GenericDaoJpaImpl;
import ar.edu.unrn.lia.model.Propiedad;
import ar.edu.unrn.lia.model.Propiedad.AlquilerVenta;
import ar.edu.unrn.lia.model.Propiedad.Estado;


//@Repository(value = "propiedadDAO")
@Named("propiedadDAO")
public class PropiedadDAOImpl extends GenericDaoJpaImpl<Propiedad, Long> implements
		PropiedadDAO, Serializable {

	public Predicate[] getSearchPredicates(Root<Propiedad> root,
			Map<String, String> filters) {

		CriteriaBuilder builder = this.entityManager.getCriteriaBuilder();
		List<Predicate> predicatesList = new ArrayList<Predicate>();
		root.alias("entity");
		
		
		String propiedadTipo = filters.get("propiedadTipo");
		if (propiedadTipo != null && !"".equals(propiedadTipo)) {
			predicatesList.add(builder.equal(root.get("propiedadTipo").get("id"), Long.parseLong(propiedadTipo) ));
		}
		
		
		String cantBathroom = filters.get("cantBanios");
		if (cantBathroom != null && !"".equals(cantBathroom)) {
			predicatesList.add(builder.equal(root.get("cantBanios"), Integer.parseInt(cantBathroom) ));
		}
		
		String cantDormitorios = filters.get("cantDormitorios");
		if (cantDormitorios != null && !"".equals(cantDormitorios)) {
			predicatesList.add(builder.equal(root.get("cantDormitorios"), Integer.parseInt(cantDormitorios) ));
		}
		
		String cantCocinas = filters.get("cantCocinas");
		if (cantCocinas != null && !"".equals(cantCocinas)) {
			predicatesList.add(builder.equal(root.get("cantCocinas"), Integer.parseInt(cantCocinas) ));
		}
		
		String cantToilette = filters.get("cantToilette");
		if (cantToilette != null && !"".equals(cantToilette)) {
			predicatesList.add(builder.equal(root.get("cantToilette"), Integer.parseInt(cantToilette) ));
		}
		
		String cochera = filters.get("cochera");
		if (cochera != null && !"".equals(cochera)) {
			predicatesList.add(builder.equal(root.get("cochera"), (cochera.equals("1")?true:false) ));
		}
		
		String cantLocalComercial = filters.get("cantLocalComercial");
		if (cantLocalComercial != null && !"".equals(cantLocalComercial)) {
			predicatesList.add(builder.equal(root.get("cantLocalComercial"), Integer.parseInt(cantLocalComercial) ));
		}
	
		String disponibilidad = filters.get("tipoDisponibilidad");
		if (disponibilidad != null && !"".equals(disponibilidad)) {
			for (AlquilerVenta av : Propiedad.AlquilerVenta.values()) {
				if (av.toString().equals(disponibilidad))
				{
					predicatesList.add(builder.equal(root.get("tipoDisponibilidad"),av));
				}
			}	
		}

		String propiedadestado = filters.get("estado");
		if (propiedadestado != null && !"".equals(propiedadestado)) {
			for (Estado av : Estado.values()) {
				if (av.toString().equals(propiedadestado))
				{
					predicatesList.add(builder.equal(root.get("estado"),av));
				}
			}	
		}
		
		String direccion = filters.get("direccion");
		if (direccion != null && !"".equals(direccion)) {
			predicatesList.add(builder.like(root.<String> get("direccion"),
					'%' + direccion + '%'));
		}
		
		String barrio = filters.get("barrio.descripcion");
		if (barrio != null && !"".equals(barrio)) {
			predicatesList.add(builder.like(root.get("barrio")
					.<String> get("descripcion"), '%' + barrio + '%'));
		}
		
		String ciudad = filters.get("barrio.ciudad.descripcion");
		if (ciudad != null && !"".equals(ciudad)) {
			predicatesList.add(builder.like(root.get("barrio").get("ciudad")
					.<String> get("descripcion"), '%' + ciudad + '%'));
		}
		
		String estado = filters.get("estado.descripcion");
		if (estado != null && !"".equals(estado)) {
			predicatesList.add(builder.like(root.get("estado")
					.<String> get("descripcion"), '%' + estado + '%'));
		}

			
		String propietario = filters.get("propietario.apellido");
		if (propietario != null && !"".equals(propietario)) {
			predicatesList.add(builder.like(root.get("propietario").<String> get("apellido"), '%' + propietario + '%'));
		}
		
		return predicatesList.toArray(new Predicate[predicatesList.size()]);
	}

}